#include "linklist.h"
#include "stdio.h"
#include <stdlib.h>
#include <string.h>

typedef struct _tag_LinkList _LinkList;
struct _tag_LinkList{
    //用指针与不用指针的唯一区别在于你用不用为他分配空间
    LinkListNode head;
    int length;
};


//创建一个空的线性表
LinkList* LinkList_Create(){
    _LinkList* list=(_LinkList*)malloc((unsigned long)sizeof(_LinkList));
    memset(list,0,sizeof(_LinkList));
    return (LinkList*)list;
}
//销毁线性表
void LinkList_Destory(LinkList* list){
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return ;
    }
    tmp=(_LinkList*)list;
    free(list);
    return ;
}
//清空线性表
void LinkList_Clear(LinkList* list){
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return ;
    }
    tmp=(_LinkList*)list;
    tmp->head.next=NULL;
    tmp->length=0;
    return ;

}
//返回线性表list中所有元素的个数
int LinkList_Length(LinkList* list){
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return -1;
    }
    tmp=(_LinkList*)list;
    return tmp->length;

}
//将一个node插入线性表
int LinkList_Insert(LinkList* list,LinkListNode *node,int pos){
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return -1;
    }
    tmp=(_LinkList*)list;
    //超过大小怎么处理，默认给他插入到最后一位吗
    if(pos<0){
        perror("pos is invalid:%d");
        return -2;
    }
    //head->0->1->2->3....
    //临时节点
    LinkListNode* tmpnode=&(tmp->head);
    //最多只能到最后一个节点
    for(int i=0;i<pos&&(tmpnode->next!=NULL);i++){
        tmpnode=tmpnode->next;
    }
    //指针必定指向之前的一个元素
    //所以当前必须把
    //prev->next
    // v	|-^
    //new---|
    node->next=tmpnode->next;
    tmpnode->next=node;
    tmp->length++;


    return 0;
}
//获取一个list 位于pos 位置处的元素
LinkListNode* LinkList_Get(LinkList* list,int pos){
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return NULL;
    }
    tmp=(_LinkList*)list;
    //超过大小怎么处理，默认给他插入到最后一位吗

    if(pos<0||pos>=tmp->length){
        perror("pos is invalid:%d");
        return NULL;
    }
    LinkListNode* tmpnode=&(tmp->head);
    for(int i=0;i<pos&&(tmpnode->next!=NULL);i++){
        tmpnode=tmpnode->next;
    }
    return tmpnode->next;
}
//删除线性表list pos位置处的元素,返回被删除的元素,NULL 表示删除失败
LinkListNode* LinkList_Delete(LinkList*list,int pos){
    //head->0->1->3
    //			2->3
    //         ^  x
    _LinkList* tmp=NULL;
    if(list==NULL){
        perror("list can not be null");
        return NULL;
    }
    tmp=(_LinkList*)list;
    //超过大小怎么处理，默认给他插入到最后一位吗

    if(pos<0||pos>=tmp->length){
        perror("pos is invalid:%d");
        return NULL;
    }
    LinkListNode* tmpnode=&(tmp->head);
    for(int i=0;i<pos&&(tmpnode->next!=NULL);i++){
        tmpnode=tmpnode->next;
    }
    LinkListNode* deleteNode=tmpnode->next;
    LinkListNode* afterDelNode=NULL;
    if(deleteNode->next!=NULL){
        afterDelNode=deleteNode->next;
    }
    tmpnode->next=afterDelNode;
    tmp->length--;

    return deleteNode;
}
